#!/bin/bash
set -xue

QEMU=qemu-system-riscv32

# clang 路径和编译器标志
CC=/usr/bin/clang  # Ubuntu 用户：使用 CC=clang
CFLAGS="-std=c11 -O2 -g3 -Wall -Wextra --target=riscv32-unknown-elf -fno-stack-protector -ffreestanding -nostdlib"
OBJCOPY=/usr/bin/llvm-objcopy

# Build the shell (application)
# 将用户程序放到 user.ld的空间中
$CC $CFLAGS -Wl,-Tuser.ld -Wl,-Map=shell.map -o shell.elf shell.c user.c common.c
$OBJCOPY --set-section-flags .bss=alloc,contents -O binary shell.elf shell.bin
$OBJCOPY -Ibinary -Oelf32-littleriscv shell.bin shell.bin.o

# Build the kernel
# 组合用户程序和内核程序
$CC $CFLAGS -Wl,-Tkernel.ld -Wl,-Map=kernel.map -o kernel.elf \
    kernel.c common.c shell.bin.o

# 以 ustar 格式创建disk.tar文件
(cd disk && tar cf ../disk.tar --format=ustar *.txt)   

# 启动 QEMU
# -drive id=drive0：定义一个名为 drive0 的磁盘，使用 lorem.txt 作为磁盘镜像。
# -device virtio-blk-device：添加一个带有 drive0 磁盘的 virtio-blk 设备。

#屏蔽调试log  -d unimp,guest_errors,int,cpu_reset -D qemu.log 

$QEMU -machine virt -bios default -nographic -serial mon:stdio --no-reboot \
    -drive id=drive0,file=disk.tar,format=raw,if=none \
    -device virtio-blk-device,drive=drive0,bus=virtio-mmio-bus.0 \
    -kernel kernel.elf
